<?php


class Uploader {

	var $files;
	var $allow_type;
	var $max_size;
	var $max_size_string;
	var $desired_dir;
	var $renamed_file;

	public function __constructor() {
	}

	# $uldr = new Uploader();
	# $upfarr = $uldr->init($_FILES);
	# $make_thumbs = NImg::thumbarr($upfarr, "./test/", array(10,20,30));

	# 파일배열
	# 허용할 마임타입 array
	# 허용할 파일 사이즈 byte
	# 타깃 디렉터리
	# 파일 리네임 여부
	public function init($_f, $allow_arr = array('image/png', 'image/jpeg', 'image/gif'), $max_size = '2097152', $desired_dir = './test/', $renamed_file = TRUE) {
		$this->files			= $_f;
		$this->allow_type		= $allow_arr;
		$this->max_size			= $max_size;
		$this->max_size_string	= IoFileAndDir::get_native_file_size($max_size);
		$this->desired_dir		= $desired_dir;
		$this->renamed_file		= $renamed_file;

		# tdd code
		//Nlog::xmp($this->docheck());
		//Nlog::xmp($this->doupload());

		if(array_key_exists("success", $this->docheck())){
			$retarr = $this->doupload();
			if(array_key_exists("success", $retarr)){
				$nretarr = array();
				foreach($retarr['success'] as $key=>$val){
					$nretarr[] = $val;
				}
				return $nretarr;
			}
		} else {
			return 'false';
		}
	}

	# 파일업로드를 체크
	private function docheck() {
		# 에러 검사.
		foreach($this->files['up']['error'] as $key=>$val){
			if ($val > 0) {
				$ret['error'] = 'Problem: ';
					switch ($val) {
						case 1:
							$ret['error'] = sprintf('File exceeded upload_max_filesize >> %s',$key);
						break;
						case 2:
							$ret['error'] = sprintf('File exceeded max_file_size >> %s',$key);
						break;
						case 3:
							$ret['error'] = sprintf('File only partially uploaded >> %s',$key);
						break;
						case 4:
							$ret['error'] = sprintf('No file uploaded >> %s',$key);
						break;
						case 6:
							$ret['error'] = sprintf('Cannot upload file: No temp directory specified. >> %s',$key);
						break;
						case 7:
							$ret['error'] = sprintf('Upload failed: Cannot write to disk. >> %s',$key);
						break;
					}
				return $ret;
			}
		}

		# 마임타입 검사
		foreach($this->files['up']['type'] as $key=>$val){
			if(!in_array($val, $this->allow_type)){
				$ret['error'] = sprintf('Problem: file is not allowed >> %s',$key);
				return $ret;
			}
		}

		# 사이즈 제한.
		foreach($this->files['up']['size'] as $key=>$val){
			if($val > $this->max_size){
				$ret['error'] = sprintf('Problem: file size must be less than %s >> %s',$max_size_string, $key);
				return $ret;
			}
		}

		# 디렉터리 체크 확인 디렉터리가 없다면 만든다.
		if(is_dir($this->desired_dir)==false){
			mkdir($this->desired_dir, 0700);
		}

		# 파일이 디렉터리인지 확인, 파일이 존재하는지확인
		foreach($this->files['up']['name'] as $key=>$val){
			if(is_dir($this->desired_dir.DIRECTORY_SEPARATOR.$val) == TRUE){
				$ret['error'] = sprintf('Problem : directory is exist. >> %s', $key);
				return $ret;
			}
			if(file_exists($this->desired_dir.DIRECTORY_SEPARATOR.$val) == TRUE){
				$ret['error'] = sprintf('Problem : file is exist. >> %s', $key);
				return $ret;
			}
		}

		$ret['success'] = "success";
		return $ret;
	}

	# 파일업로드를 실행.
	private function doupload() {
		foreach($this->files['up']['tmp_name'] as $key=>$val){

			if (is_uploaded_file($val)){
				if($this->renamed_file == TRUE){
					# 네임으로부터 확장자를 추출.
					$fname = IoFileAndDir::explode_file_and_file_ext($this->files['up']['name'][$key]);
					$fext = $fname['ext'];
					$filename[$key] = strtolower( sprintf("%s%s.%s",time(),CharacterGenerate::random_string(15),$fext) );
				} else {
					$filename[$key] = $this->files['up']['name'][$key];
				}
				if(!move_uploaded_file($val, $this->desired_dir.DIRECTORY_SEPARATOR.$filename[$key])){
					$ret['error'] = sprintf('Problem: Could not move file to destination directory >> ', $key);
					return $ret;
				}
			}
			$ret['success'][$key] = $filename[$key];
		}
		return $ret;
	}

	# 필요할때 사용 배열을 바꾼다.
	private function rearrange($arr){
		foreach( $arr as $key => $all ){
			foreach( $all as $i => $val ){
				$new[$i][$key] = $val;
			}
		}
		return $new;
	}
}

//
//class Uploader
//{
//	var $file;
//	var $target;
//	var $extType;
//	var $chkType;
//
//	function upload_file($file='',$target='',$chkType='')
//	{
//		if($file){
//			$this->upload_set($file,$target,$chkType);
//		}
//	}
//
//	/**
//	 * 변수 할당
//	 * @void
//	*/
//	function upload_set(&$file,$target,$chkType='')
//	{
//		$this->file = &$file;
//		$this->target = $target;
//		switch($this->chkType){
//			case "design":
//				$this->extType = array('html','php');
//				$this->chkType = "text";
//			break;
//			default:
//				$this->extType = array('html','htm','php');
//				$this->chkType = $chkType;
//			break;
//		}
//	}
//
//	/**
//	 * 일반 업로드 파일 확장자 검증
//	 * @return bool
//	*/
//	function file_extension_check()
//	{
//		if($this->file['name']){
//			$tmp = explode('.',$this->file['name']);
//			$extension = strtolower($tmp[count($tmp)-1]);
//			if(in_array($extension,$this->extType))return false;
//		}
//		return true;
//	}
//
//	/**
//	 * 일반 업로드 파일 검증
//	 * @return bool
//	*/
//	function file_type_check()
//	{
//		if ( ! function_exists ( 'mime_content_type' ) ) return true;
//		if($this->file['tmp_name']){
//			$mime = mime_content_type($this->file['tmp_name']);
//			if($this->chkType&&!preg_match('/'.$this->chkType.'/',$mime))return false;
//		}
//		return true;
//	}
//
//	/**
//	 * 파일업로드
//	 * @return bool
//	*/
//	function upload()
//	{
//		if($this->file['tmp_name']){
//			if(!$this->file_extension_check()){
//				return false;
//			}
//			if(!$this->file_type_check()){
//				return false;
//			}
//			@move_uploaded_file($this->file['tmp_name'],$this->target);
//			@chmod($this->target,0707);
//		}
//		return true;
//	}
//
//	function reverse_file_array($arr) {
//		if(!$arr)return false;
//		foreach($arr as $k => $v)
//			foreach($v as $k1 => $v1)$tmp[$k1][$k] = $v1;
//		return 	$tmp;
//	}
//}
?>